home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / Timing / vclock_1_9a.lha / vClock / timer.c < prev    next >
C/C++ Source or Header  |  1994-01-12  |  4KB  |  138 lines

  1. /* $Id: timer.c,v 1.1 93/02/15 23:29:54 tf Exp $ © 1992,93 by Tobias Ferber */
  2.  
  3. #include "timer.h"
  4.  
  5. /*
  6.  * FUNCTION
  7.  *
  8.  *   open_timer -- open the timer.device
  9.  *
  10.  * SYNOPSIS
  11.  *
  12.  *   treq= open_timer(portname, portpri);
  13.  *
  14.  *   struct timerequest *open_timer(STRPTR, LONG);
  15.  *
  16.  * DESCRIPTION
  17.  *
  18.  *   This function opens the timer.device and returns a fully initialized
  19.  *   timerequest structure (treq).
  20.  *   open_timer() allocates both, a message port (replyport) including a
  21.  *   signal bit and the timerequest structure.  The replyport will then be
  22.  *   linked to treq in treq->tr_node.io_Message.mn_ReplyPort.
  23.  *
  24.  *   You *must* use close_timer() to free all this.
  25.  *
  26.  * INPUTS
  27.  *
  28.  *   portname - public name of the message port, or NULL if the port
  29.  *              is not named. (ports should not be named if they're not
  30.  *              used for rendez-vous between tasks)
  31.  *   portpri  - Priority used for insertion into the public port list,
  32.  *              normally 0.
  33.  *
  34.  * RESULT
  35.  *
  36.  *   treq     - a new timerequest structure ready for use, or NULL if
  37.  *              either the port or the treq structure could not be
  38.  *              created due to not enough memory or no available signal
  39.  *              bit.
  40.  */
  41.  
  42. struct timerequest *open_timer(STRPTR portname, long portpri)
  43. { struct timerequest *treq= (struct timerequest *)NULL;
  44.   struct MsgPort *replyport= (struct MsgPort *)
  45.     CreatePort(portname, portpri);
  46.   if(replyport != (struct MsgPort *)NULL)
  47.   { treq= (struct timerequest *)
  48.       CreateExtIO(replyport,sizeof(struct timerequest));
  49.     if(treq != (struct timerequest *)NULL)
  50.     { long err= OpenDevice(TIMERNAME,UNIT_VBLANK,(struct IORequest *)treq,0L);
  51.       if(err!=0)
  52.       { DeleteExtIO((struct IOStdReq *)treq,sizeof(struct timerequest));
  53.         treq= (struct timerequest *)NULL;
  54.       }
  55.     }
  56.     if(treq == (struct timerequest *)NULL) /* not 'else' */
  57.       DeletePort(replyport);
  58.   }
  59.   return(treq);
  60. }
  61.  
  62. /*
  63.  * FUNCTION
  64.  *
  65.  *   close_timer -- close the timer.device if opened via open_timer()
  66.  *
  67.  * SYNOPSIS
  68.  *
  69.  *   close_timer(treq);
  70.  *
  71.  *   VOID close_timer(struct timerequest *);
  72.  *
  73.  * DESCRIPTION
  74.  *
  75.  *   Frees up the timerequest structure and replyport as allocated by
  76.  *   open_timer().
  77.  *
  78.  * INPUTS
  79.  *
  80.  *   treq - pointer to the timerequest structure which was returned
  81.  *          from open_timer()
  82.  */
  83.  
  84. void close_timer(struct timerequest *treq)
  85. { if(treq != (struct timerequest *)NULL)
  86.   { struct MsgPort *mp= treq->tr_node.io_Message.mn_ReplyPort;
  87.     if(AbortIO((struct IORequest *)treq) == 0)
  88.       WaitIO((struct IORequest *)treq);
  89.     CloseDevice((struct IORequest *)treq);
  90.     DeleteExtIO((struct IOStdReq *)treq, sizeof(struct timerequest));
  91.     if(mp != (struct MsgPort *)NULL)
  92.       DeletePort(mp);
  93.   }
  94. }
  95.  
  96. /*
  97.  * FUNCTION
  98.  *
  99.  *   queue_timer -- queue a timer request
  100.  *
  101.  * SYNOPSIS
  102.  *
  103.  *   queue_timer(treq, secs, micro);
  104.  *
  105.  *   VOID queue_timer(struct timerequest *, long, long);
  106.  *
  107.  * DESCRIPTION
  108.  *
  109.  *   Tells the timer device to signal after <secs> seconds and <micro>
  110.  *   micro seconds.  This request is sent using SendIO() i.e. this
  111.  *   function returns immediately.
  112.  *
  113.  * INPUTS
  114.  *
  115.  *   treq  - pointer to the timerequest structure
  116.  *   secs  - #of seconds until timer.device signals treq's replyport
  117.  *   micro - #of micro seconds until doom ;)
  118.  */
  119.  
  120. void queue_timer(struct timerequest *treq, long secs, long micro)
  121. { if(treq != (struct timerequest *)NULL)
  122.   { /*if(CheckIO((struct IORequest *)&treq->tr_node))*/
  123.     { treq->tr_node.io_Command= TR_ADDREQUEST;
  124.       treq->tr_node.io_Flags= 0;     /* not used (yet) */
  125.       treq->tr_time.tv_secs  = secs;
  126.       treq->tr_time.tv_micro = micro;
  127.       SendIO((struct IORequest *)treq);
  128.     }
  129.   }
  130. }
  131.  
  132. void purge_timer(struct timerequest *treq)
  133. { if(treq != (struct timerequest *)NULL)
  134.   { if(AbortIO((struct IORequest *)treq) == 0)
  135.       WaitIO((struct IORequest *)treq);
  136.   }
  137. }
  138.